package string;
/**String的演示*/
public class StringDemo {
    public static void main(String[] args) {
        /*
        常见面试题：
        String s = new String("hello");
        创建了几个对象？
        答：两个，一个"hello",
        java创建一个String对象表示字面量"hello"，并存入常量池
        一个new String(),
        new String（）时会再创建一个字符串对象，并引用hello字符串内容
         */
        String s = new String("hello");//创建了2个对象
        String  s1 = "hello";//复用常量池中的字面量对象地址
        //实际应用中，String比较相等一般都是比较字符串的内容是否相同，使用equals（）方法
        System.out.println(s.equals(s1));//true,equals()对比的是内容是否相同





















        /*
        使用字面量（""）来创建字符串对象时，JVM会检查常量池中是否有该对象
        1.若没有，则会创建字符串对象，并将其引用存入到常量池中
        2.若有，则直接将常量池中的对象（引用）返回，不会创建新的字符串对象

        String s1 = "123abc";//常量池中没有，因此创建该字符串对象，并存入常量池中
        String s2 = "123abc";//常量池中已有，直接复用，访问存储地址，不新建对象
        String s3 = "123"+"abc";//两字面量相连，则相当于String s3 ="123abc";,常量池中已有，直接复用
        String s4 = "123";
        //s4是个变量，编译期不会直接编译好，不等于String s4 ="123abc";
        s4 =s4 + "abc";
        //引用类型==，比较的是地址是否相同
        System.out.println(s1==s2);//true
        System.out.println(s1==s3);//true
        System.out.println(s2==s3);//true
        System.out.println(s1==s4);//false

        s1 = s1 + "!";//创建新的字符串对象（"123abc!"）,并讲地址赋值给s1
        System.out.println(s1==s2);//false
*/
    }
}
